package com.star.io.thread;

import java.util.concurrent.*;

/**
 * @Description 线程池
 * @Author powder
 * @Date 2024/10/21
 * @Version 1.0
 **/
public class MyThreadPoolExecutor extends ThreadPoolExecutor {

    /**
     * 默认工厂和拒绝策略的构造方法
     * @param corePoolSize 线程池中保持活动状态的最小线程数：即使没有任务需要执行，核心线程也不会被回收。当有新任务提交时，如果核心线程都在忙碌，则会创建新的线程来处理任务
     * @param maximumPoolSize 线程池中允许的最大线程数：当工作队列满了并且活动线程数达到最大线程数时，如果还有新任务提交，线程池将不会创建新的线程来处理任务（根据拒绝策略处理）
     * @param keepAliveTime 非核心线程在没有任务执行时的最长存活时间：当线程池中的线程数超过核心线程数且空闲时间达到设定值时，多余的线程将被终止，直到线程池中的线程数不超过核心线程数
     * @param unit 用于指定keepAliveTime的时间单位：常见值：秒（SECONDS）、毫秒（MILLISECONDS）等
     * @param workQueue 用于保存等待执行的任务的队列：当线程池中的线程都在忙碌时，新提交的任务将被添加到工作队列中等待执行；
     *                  有界队列（如ArrayBlockingQueue）、无界队列（如LinkedBlockingQueue）、同步队列（如SynchronousQueue）等
     */
    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
    }

    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
    }

    /**
     *
     * @param corePoolSize 线程池中保持活动状态的最小线程数：即使没有任务需要执行，核心线程也不会被回收。当有新任务提交时，如果核心线程都在忙碌，则会创建新的线程来处理任务
     * @param maximumPoolSize 线程池中允许的最大线程数：当工作队列满了并且活动线程数达到最大线程数时，如果还有新任务提交，线程池将不会创建新的线程来处理任务（根据拒绝策略处理）
     * @param keepAliveTime 非核心线程在没有任务执行时的最长存活时间：当线程池中的线程数超过核心线程数且空闲时间达到设定值时，多余的线程将被终止，直到线程池中的线程数不超过核心线程数
     * @param unit 用于指定keepAliveTime的时间单位：常见值：秒（SECONDS）、毫秒（MILLISECONDS）等
     * @param workQueue 用于保存等待执行的任务的队列：当线程池中的线程都在忙碌时，新提交的任务将被添加到工作队列中等待执行；
     *                  有界队列（如ArrayBlockingQueue）、无界队列（如LinkedBlockingQueue）、同步队列（如SynchronousQueue）等
     * @param threadFactory 用于创建新线程的对象：可以自定义线程的名称、优先级等属性。默认情况下，使用Executors.defaultThreadFactory()来创建线程
     * @param handler 当工作队列已满且线程池中的线程数已达到最大线程数时，用于处理新提交的任务的策略；常见策略：
     *                  AbortPolicy：丢弃任务并抛出RejectedExecutionException异常。
     *                  CallerRunsPolicy：由调用线程（提交任务的线程）直接运行被拒绝的任务。
     *                  DiscardPolicy：丢弃任务，但不抛出异常。
     *                  DiscardOldestPolicy：丢弃队列中最旧的任务（即等待时间最长的任务），然后尝试重新提交当前任务。
     */
    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
    }
}
